const mongojs = require('mongojs');
const _ = require('lodash');

// 创建一个数据库 
const db = mongojs(`mongodb://132.232.87.95/fresh`);

// 公共类
class Common {
  // module 模块
  constructor(collection) {
    if (!collection) {
      throw new Error('缺少模块名称');
    }
    this.collection = collection;
  }

  // 把字符串类型的id变成ObjectId类型
  ObjectId(id) {
    return mongojs.ObjectId(id);
  }

  // 查询数量
  count(query, collection) {
    query = query || {};
    collection = collection || this.collection;
    return new Promise((resove, reject) => {
      db[collection].count(query, (err, doc) => {
        if (err) {
          reject(err);
        } else {
          resove(doc);
        }
      })
    })
  }

  /**
   * 添加数据
   * @param {object} data 要插入的数据
   */
  insert(data, collection) {
    collection = collection || this.collection;
    let promise = new Promise((resolve, reject) => {
      // 操作数据库
      db[this.collection].insert(data, (err, doc) => {
        if (err) {
          reject(err);
        } else {
          resolve(doc);
        }
      });
    })

    return promise;
  }

  // 删除全部
  removeAll(collection) {
    collection = collection || this.collection;
    return new Promise((resolve, reject) => {
      // 操作数据库
      db[this.collection].remove({}, (err, doc) => {
        if (err) {
          reject(err);
        } else {
          resolve(doc);
        }
      });
    })
  }

  // 删除
  removeById(_id) {
    return new Promise((resolve, reject) => {
      let query = {
        // _id需要转换成ObjectId类型
        _id: this.ObjectId(_id)
      }
      db[this.collection].remove(query, true, (err, doc) => {
        if (err) {
          reject(err);
        } else {
          resolve(doc);
        }
      })
    })
  }

  update(query, data, collection) {
    collection = collection || this.collection;
    return new Promise((resolve, reject) => {
      db[collection].update(query, {
        $set: data
      }, (err, doc) => {
        if (err) {
          reject(err);
        } else {
          resolve(doc);
        }
      })
    })
  }

  /**
   * 根据条件查询
   * @param {object} query 查询条件
   * @param {string} collection 集合名称
   */
  find(query, collection) {
    query = query || {};
    collection = collection || this.collection;
    return new Promise((resolve, reject) => {
      db[collection].find(query, (err, docs) => {
        if (err) {
          reject(err);
        } else {
          resolve(docs);
        }
      })
    })
  }

  /**
   * 查询所有
   * @param {string} collection 集合名称
   */
  findAll(collection) {
    collection = collection || this.collection;
    return new Promise((resolve, reject) => {
      db[collection].find((err, docs) => {
        if (err) {
          reject(err);
        } else {
          resolve(docs);
        }
      })
    })
  }

  /**
   * 
   * @param {*} _id 
   * @param {*} collection 集合,需要的时候传进来
   */
  findById(_id, collection) {
    collection = collection || this.collection;
    return new Promise((resolve, reject) => {
      db[collection].findOne({
        _id: this.ObjectId(_id)
      }, (err, doc) => {
        if (err) {
          reject(err);
        } else {
          resolve(doc);
        }
      });
    })
  }


  /**
   * @param {array} attrs 要检查的字段
   * @param {*} ctx 
   */
  checkAttr(attrs, ctx) {
    let params = ctx.params;
    let res = attrs.find(attr => {
      return params[attr] === "undefined" || params[attr] === undefined || params[attr] === "";
    });

    if (res) {
      return {
        code: 111,
        msg: `缺少${res}`
      }
    } else {
      return false;
    }
  }

  /**
   * 从一个列表里返回所需的字段
   * @param {需要的属性} attrs 
   * @param {要处理的列表} list 
   */
  handleList(attrs, list) {
    let newList = list.map(item => {
      let obj = {};
      attrs.forEach(attr => {
        obj[attr] = item[attr];
      })
      return obj;
    })
    return newList;
  }

  /**
   * 从详情里获取所需的字段
   * @param {*} attrs 
   * @param {*} detail 
   */
  handleDetail(attrs, detail) {
    let newDetail = {};
    attrs.forEach(attr => {
      newDetail[attr] = detail[attr];
    });
    return newDetail;
  }

  /**
   * 封装成功的信息
   * @param {object或array} data 
   * @param {string} msg 信息
   * @param {string} dataName 数据的名称 
   */
  successInfo(data, msg, dataName) {
    // 判断data的数据类型是不是数组
    let isArray = _.isArray(data);
    // 不传入数据的名称
    if (!dataName) {
      dataName = isArray ? 'list' : 'result';
    }
    return {
      code: 666,
      msg: msg || 'success',
      [dataName]: data
    }
  }

  errInfo(error, msg) {
    console.log('错误信息', error);
    return {
      code: error.errcode || 111,
      msg: msg || error.message || error.errmsg
    }
  }
}

module.exports = Common;
